Houdiniメモ : テキストを円周に沿うように変形
以下のようなテキストを用意します。
https://gyazo.com/3d125c6f7905c45fcbe9826e38fa1317
これを以下のように円周に沿うように変形するSubnetworkを紹介します。
https://gyazo.com/4273a32749c53395edaa65ac00d98f71
Subnetworkのパラメータ
table:Subnetworkパラメータ
repeat 文章の繰り返しの回数
radius 円の半径
height 変形後の文章の高さ
https://gyazo.com/fdd165f63c204cc0066a7241a1f5ace1
これらのパラメータはParameter Interfaceで以下のように定義しています。
https://gyazo.com/67a2f2ffc03afb3ba2c3abb6bb59c814
Subnetwork内部
https://gyazo.com/9460c21e86756acf607fb6a460c33e46
ノード
■テキストを横に並べていく
Copy and Transform ノードを利用して、テキストを横に並べていきます。
コピー数はSubnetwork上で定義したパラメータrepeatを利用しています。
table:Copy and Transform
Total Number ch("../repeat")
Translate(X) bbox(0, D_XSIZE)
https://gyazo.com/1ee829e2a34b788f4092cf3819931908
■バウンディングボックスの最大・最小の計算
AttributeWrangleノードでバウンディングボックスの最大・最小を求め、 アトリビュートに保存します。
Attribute Wrangle の Run Over = PrimitiveにしてVEXが一回だけ実行されるようにします。
https://gyazo.com/f6d01f36d72eae96beab5c0c64b70108
code:compute_min_max(c)
// バウンディングボックスの最大・最小を計算
vector min, max;
getbbox(min, max);
// アトリビュートへ保存
v@min = min;
v@max = max;
■円形に変形する
X軸を円の角度、Y軸を円の半径として利用してポイントを円形に変形させます。
https://gyazo.com/ecf60cdde4fb8a1340b7e5f996c07a37
code:move_points(c)
// バウンディングボックスの最大・最小を取得
vector min = prim(geoself(), "min", 0);
vector max = prim(geoself(), "max", 0);
// y座標を半径rとして利用
float height = chf("height");
float radius = chf("radius");
float rMin = radius;
float rMax = radius + height;
float r = fit(@P.y, min.y, max.y, rMin, rMax);
// x座標を角度radianとして利用
float radianMin = 0.0;
float radianMax = 2.0 * $PI;
float radian = fit(@P.x, max.x, min.x, radianMin, radianMax);
// ポイントの座標の更新
float x = r * cos(radian);
float y = r * sin(radian);
float z = 0;
@P = set(x, y, z);